'''
 threading.Lock()使用
  如果多个线程共同对某个数据修改，则可能出现不可预料的结果，为了保证数据的正确性，需要对多个线程进行同步。
  使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步，这两个对象都有 acquire 方法和 release 方法，对于那些需要每次只允许一个线程操作的数据，可以将其操作放到 acquire 和 release 方法之间。
'''

import time,threading

# 假定这是你的银行存款:
balance = 0
lock = threading.Lock()

def change_it(n):
    # 先存后取，结果应该为0:
    global balance
    balance = balance+n
    balance = balance-n


def run_thread(n):
    for i in range(100000):
        #获取锁
        lock.acquire()
        try:
            #放心改
            change_it(i)
        finally:
            #修改完后释放锁
            lock.release()




def main():
    t1 = threading.Thread(target=run_thread,args=(5,))
    t2 = threading.Thread(target=run_thread,args=(8,))

    t1.start()
    t2.start()

    t1.join()
    t2.join()

    print(balance)
    

if __name__ == "__main__":
    main()
